#include <stdio.h>
#include "loop_queue_1.h"

//获得第一个数字所在下标的函数
int get_head(const queue* p_queue) {
	int ret = p_queue->tail - p_queue->qty;
	if(ret < 0) {
		ret += SIZE;
	}
	return ret;
}

//队列的初始化函数
void queue_init(queue* p_queue) {
	p_queue->qty = 0;
	p_queue->tail = 0;
}

//队列的清理函数
void queue_deinit(queue* p_queue) {
	p_queue->qty = 0;
	p_queue->tail = 0;
}

//获得队列里数字个数的函数
int queue_size(const queue* p_queue) {
	return p_queue->qty;
}

//判断队列是否空的函数
int queue_empty(queue* p_queue) {
	return !p_queue->qty;
}

//判断队列是否满的函数
int queue_full(const queue* p_queue) {
	return p_queue->qty >= SIZE;
}

//向队列里加入数字的函数
int queue_push(queue* p_queue,int val) {
	if(p_queue->qty >= SIZE) {
	//队列满了
		return 0;
	}
	p_queue->buf[p_queue->tail] = val;
	p_queue->tail++;
	if(p_queue->tail >= SIZE) {
	//如果tail超出SIZE范围，把tail归零
		p_queue->tail = 0;
	}
	p_queue->qty++;
	return 1;
}

//从队列里获取数字的函数（同时删除数字）
int queue_pop(queue* p_queue, int* p_val) {
	if(!p_queue->qty) {
	//队列是空的
		return 0;
	}
	*p_val = p_queue->buf[get_head(p_queue)];	//使用get_head函数得到第一个数字所在的下标，把这个存储区里的数字传递给调用函数
	p_queue->qty--;		//把qty减一就相当于删除了这个数字
	return 1;
}

//从队列里获得数字的函数（不会删除数字）
int queue_top(const queue* p_queue, int* p_val) {
	if(!p_queue->qty) {
	//队列是空的
		return 0;
	}
	*p_val = p_queue->buf[get_head(p_queue)];
	return 1;
}
